package com.example.cpopcopy.controller;

import com.example.cpopcopy.mapper.UserMapper;
import com.example.cpopcopy.model.User;
import com.example.cpopcopy.tools.Constant;
import com.example.cpopcopy.tools.ResponseMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-17
 * Time: 11:01
 */

@RestController
@Slf4j
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserMapper userMapper;


    //登录功能
    @RequestMapping("/login1")
    public ResponseMessage login1(@RequestParam String username,
                                 @RequestParam String password,
                                 HttpServletRequest request){
        //传来的参数 先调用数据库 里的数据 去对比
        User user = userMapper.login(username,password);
        //不符合数据库中的数据 直接返回null
        //不用进行非空非空判断
        if (user == null){
            //登录失败
            return new ResponseMessage<>(-1,"用户名或密码错误",user);
        }else {
            //登录成功之前将用户的数据 保存在Session当中
            request.getSession().setAttribute(Constant.USERINFO_SESSION_KEY,user);
            return new ResponseMessage<>(1,"登录成功",user);
        }
        //目前还没有对密码加密
    }


    //注入加密类
    //一定要启动类加代码
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    //如果没有对密码进行加密 那么直接在数据库中查找 判断即可 但是加密之后 数据库当中存储的是加密的密码
    //那么就要先获得到数据库中的用户名 在服务器对密码进行解密之后对比 正确与否
    //登录功能
    @RequestMapping("/login")
    public ResponseMessage login(@RequestParam String username,
                                 @RequestParam String password,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws IOException {
        //传来的参数 先调用数据库 里的数据 去对比
        User user = userMapper.selectName(username);
        //根据用户名查询 保证单一性
        //不符合数据库中的数据 直接返回null
        //不用进行非空非空判断
        if (user == null){
            //登录失败
            return new ResponseMessage<>(-1,"用户名或密码错误",user);
        }else {
            boolean flg = bCryptPasswordEncoder.matches(password,user.getPassword());
            if (!flg){
                return new ResponseMessage<>(-1,"用户名或密码错误",user);
            }
            //引入加密框架
            //登录成功之前将用户的数据 保存在Session当中
            // 往session中存放key-value
            //getSession()：从HttpServletRequest中获取session .setAtt() 设置session1的key val的值
            //在别的地方就可以通过这个key来获取val的值
            request.getSession().setAttribute(Constant.USERINFO_SESSION_KEY,user);
            //为什么这个重定向页面 不跳转
            //response.sendRedirect("/upload.html");
            System.out.println(user.toString());
            return new ResponseMessage<>(1,"登录成功",user);
        }
        //目前还没有对密码加密
    }
}
